﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using Ord;

namespace OrdonnanceAI
{

    /********************************************************************************************************
     * Для добавления нового бота нужно                                                                     *
     * - создать новую функцию для определения слудующей выкладываемой карты в разделе 'алгоритмы ботов'    *
     * - добавить написаную функцию в функцию PlayCard со следующим свободным номером                       *
     * - добавить имя бота в функции GetBotName с этим же номером                                           *
     * намера ботов должны начинаться с нуля и идти по порядку без пропусков(0,1,2,3.....)                  *
     ********************************************************************************************************/

    public static class AI
    {
        /// <summary>Имя бота</summary>
        /// <param name="AInum">Номер бота</param>
        /// <returns></returns>
        public static String GetBotName(byte AInum)
        {
            Dictionary<byte, string> bots = GetAvailableBots();
            if (bots.ContainsKey(AInum)) return bots[AInum];

            throw new Exception("Не найдено имя для бота с номером " + AInum.ToString());
        }

        /// <summary>Получить список доступных ботов</summary>
        public static Dictionary<byte, string> GetAvailableBots()
        {
            Dictionary<byte, string> ret = new Dictionary<byte, string>();
            ret.Add(0, "Бот один");
            ret.Add(1, "Бот блондинка");
            ret.Add(2, "Бот умный");
            return ret;
        }

        /// <summary>рассчитать какую карту выложить и в какой город
        /// город - X, карта - Y
        /// AInum - номер бота
        /// если все города заполнены, 
        /// </summary>
        public static CardPoint PlayCard(List<Town[]> EnemyTowns, Town[] PlTown, List<Card> PlCards, int AInum)
        {
            DateTime dt = DateTime.Now;
            bWriteLog = AInum == LogBotNum;

            AddAILog("*** НАЧАЛО ХОДА ************************************", 0);

            #region *** если все города заполнены, выходим ********
            bool bExit = true;
            for (int t = 0; t < 5; t++)
            {
                if (PlTown[t].card.Count < 4)
                {
                    bExit = false;
                    break;
                }
            }
            if (bExit)
            {
                AddAILog("*** Все города заполнены ***", 0);
                AddAILog("*** КОНЕЦ ХОДА ************************************", 0);
                AddAILog("***************************************************\r\n", 0);
                return new CardPoint(-1, -1);
            }
            #endregion *** если все города заполнены, выходим ********

            CardPoint ret = new CardPoint(int.MinValue, 0);

            if (AInum == 0) ret = BotFirst.PlayCard(PlTown, PlCards);
            if (AInum == 1) ret = BotBlond.PlayCard(PlTown, PlCards);
            if (AInum == 2) ret = BotClever.PlayCard(EnemyTowns, PlTown, PlCards);

            if (ret.NumTown != int.MinValue)
            {
                AddAILog("*** Время хода " + (DateTime.Now - dt).TotalMilliseconds + " мс", 0);
                AddAILog("*** КОНЕЦ ХОДА ************************************", 0);
                AddAILog("***************************************************\r\n", 0);
                return ret;
            }

            throw new Exception("Не найден алгоритм для бота с номером " + AInum.ToString());
        }

        #region *** логирование ***************************************************

        public static List<string> logL = new List<string>();
        /// <summary>Тип бота, который будет логироваться</summary>
        public static int LogBotNum = -1;
        static bool bWriteLog; // логируемый ли сейчас бот

        // логирование решений бота на время тестирования алгоритма
        public static void AddAILog(string s, int level)
        {
            if (!bWriteLog) return;
            for (int i = 0; i < level; i++) s = "\t" + s;
            logL.Add(s);
        }

        #endregion *** логирование ***************************************************

    }

}
